#include <sys/types.h>
#include <dirent.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>

#define FILE_NAME_STORE "01_test.txt"
#define DIR_NAME "/"

char * FormatDirentToStr( char *pStrDst, const struct dirent *pDirEnt )
{

/*
struct dirent
{
    __ino_t d_ino;
    __off_t d_off;
    unsigned short int d_reclen;
    unsigned char d_type;
    char d_name[256];	
};
*/
    sprintf( pStrDst, "d_ino: %-8ld\td_off: %ld\td_reclen: %d\td_type: %d\td_name: %s\n",
                    pDirEnt->d_ino,   pDirEnt->d_off, pDirEnt->d_reclen, pDirEnt->d_type, pDirEnt->d_name );

    return pStrDst;
}

int main(int argc, char const *argv[])
{
    FILE* fpDst = fopen( FILE_NAME_STORE, "w" );
    if ( NULL == fpDst )
    {
        perror( "Fail fopen" );
        return -1;
    }


    DIR *pDirOpen = opendir( DIR_NAME );
    if ( NULL == pDirOpen )
    {
        perror( "Fail opendir" );
        return -1;
    }

    int iCnt=0;
    struct dirent *ptDir;
    char strDirent[sizeof(struct dirent)] = {0};
    while ( NULL != ( ptDir = readdir( pDirOpen ) ))
    {
        FormatDirentToStr( strDirent, ptDir );
        fprintf( fpDst, "%s", strDirent );
        iCnt++;
    }
    int iError = errno;
    if ( 0 != iError ) 
    {
        perror( "Fail readdir" );
        return -1;
    }
    closedir( pDirOpen );

    fclose( fpDst );

    printf( "Total Read #%d dirent from dir < %s >\n", iCnt, DIR_NAME );

    return 0;
}

/*
程序功能:
    读取指定目录中的文件列表, 逐个打印文件信息, 同时保存到文本文件中.

程序流程:
    打开目录
    打开文件流
    循环读取目录中的文件列表
        打印文件信息
        保存文件信息到文件
    关闭目录
    关闭文件流

涉及函数:
    opendir
    readdir
    closedir
    sprintf
    fprintf

知识要点:
   函数 readdir
        从目录流中依次读取目录条目信息  dirent结构体指针
        如果读取完成, 返回NULL, errno 值不变 为零
        如果读取失败, 返回NULL, 并设置 errno 为非零值
        需要根据 errno 的值来判断正常读取完成还是读取失败
        <Linux编程> page 99 page 102


*/